加密与解密 第2篇 调试篇
第三章 静态分析技术
3.1 文件类型分析
3.1.1 PEiD工具
- option -> register shell extensions
- 扩展文件接口 userdb.txt,可以自定义一些特征码,识别出新的文件类型
- 签名制作插件:add signature,配合od修正
3.1.2 fileinfo工具
3.2 静态反汇编
3.2.1 反汇编引擎
- udis86
- ade
- xde
- mlde32
- virxasm
- od插件:FullDisasm
3.2.2 ipa pro简介
-
分析过程分2个阶段
-
将程序和代码分开
为函数做标记并分析其参数调用
分析跳转、调用等指令关系并给标签赋值等
-
识别出文件的编译类型,装载对应的编译器特征文件,给各函数赋名
-
加载出现错误
-
ida分析出有问题的代码
关闭
Kernel Options1->make final analysis pass
-
一些代码不在预计的位置而不被确认
关闭
Kernel Options2->coagulate data segments in the final pass
3.2.3 ida配置
-
idag.cfg文件
-
编辑工具:editplus、Ultraplus
-
组成:
-
定义文件的扩展名、内存、屏幕等
-
配置普通参数:代码显示格式、ascii字符显示格式、脚本定义、处理器选项
-
一些问题
max_item_lines :默认5000,许多大文件不够用
-
选项
-
反汇编选项
- ascii字符串与符号
- 显示中文字符
3.2.4 IDA主窗口界面
3.2.5 交叉参考
- X键: 打开交叉参考窗口
3.2.6 参考重命名
- N键
3.2.7 标签的用法
- ctrl+M:跳到标记位置
3.2.8 进制的转换
3.2.9 代码和数据转换
- C键:切换为指令
- P键:定义为子程序
- U键:重新以16进制数显示
- D键:db、dw、dd之间转换
3.2.10 字符串
- A键:弹出ida支持的字符串格式
- G键:跳转到某一地址
- 空格键:切换流程图和反汇编模式
- N键:重命名地址为某字符串
3.2.11 数组
- edit/array 小键盘
*
:weary:
3.2.12 结构体
-
shift+F11:加载类型库窗口 -> intert键:可用的类型库窗口
-
shift+F9: 结构体管理窗口-> insert键:增加结构体-> add standart structure
-
ida 版本=5.x,shift+F9: 结构体管理窗口-> insert键-> cancel,结构体数据会显现出来
-
按
+
键,展开结构体,但是貌似只有在小键盘上有效?笔记本悲催:sweat: -
alt+Q: 在反汇编窗口中对数据应用结构体
-
T键:在操作数类型中应用结构体
-
批量替换结构体:选中需要替换的部分,T键,然后替换
-
从已经分析好的数据中建立结构体,选择好分析好的数据后:
edit/structs/create from data
- 在结构体中嵌套结构体union(共用体)
在结构体窗口中使用alt+Q
- 从c文件头中导入结构
load file/parse c header file
3.2.13 枚举类型
- shift+F10:打开枚举类型窗口
- insert添加
- 在代码窗口,M键替换
- 支持bit-fileds类型
3.2.14 堆栈变量
- ctrl+k:打开堆栈窗口
3.2.15 IDC脚本
实例1 查看输入函数
//Imports.idc 列出当前程序的输入函数
//(c) www.PEDIY.com 2000-2008
#include <idc.idc>
static GetImportSeg()
{
auto ea, next, name;
ea = FirstSeg();
next = ea;
while ( (next = NextSeg(next)) != -1) {
name = SegName(next);
if ( substr( name, 0, 6 ) == ".idata" ) break;
}
return next;
}
static main()
{
auto BytePtr, EndImports;
BytePtr = SegStart( GetImportSeg() );
EndImports = SegEnd( BytePtr );
Message(" \n" + "Parsing Import Table...\n");
while ( BytePtr < EndImports ) {
if (LineA(BytePtr, 1) != "") Message("\n" + "____" + LineA(BytePtr,1) + "____" + "\n");
Message(Name(BytePtr) + "\n");
BytePtr = NextAddr(BytePtr);
}
Message("\n" + "Import Table Parsing Complete\n");
}
- 导入idc脚本
File/idc file
实例2 用idc分析加密代码
- SMC(self modifying code)
```c //encrypted.idc //(c) www.PEDIY.com 2000-2008
#include
} ```
-
file/idc file
引入idc文件 -
shift+F2
执行idc函数c decrypt(0x00401060,0x15,0x1)
-
U
将所有代码以数据形式显示出来 -
C
将此段代码重新分析 -
结合od
通过ida的additional binary file
的功能将od解码出的文件重新加载
- 脚本工具:IDApython、IDAperl
3.2.16 FLIRT
-
fast library identificaiton and recongnition technology
-
签名文件格式:.sig
-
shift+F5
:打开签名窗口
insert
打开文件列表窗口,选中签名文件,然后激活
应用后,将自动重新分析全部代码
如果没有自动分析,options/analysis
-> reanalyse program
-
签名文件的制作:
-
有lib文件的情况
- pcf转换
pcf *.lib *.pat
- sigmake转换
sigmake *.pat *.sig
-
没有lib,只有dll
- 反汇编该dll
- idb2pat插件生成pat
- sigmake签名
3.2.17 插件
- hex-rays decomplier 反汇编成高级语言
3.2.18 其他功能
-
图形化模式
-
加载符号文件
load file/pdb file
自动从微软官网寻找最合适当前版本的pdb或dbg
-
api帮助关联
-
将idagui.cfg中的
helpfile
指向本地windows api帮助文件 -
ctrl + F1
实现查询 -
文件输出
file/produce file
-
map文件
各函数等符号信息
-
asm文件
仅输出汇编文件部分
-
dump database to IDC file
低版本向高版本恢复当前使用数据
-
dump typeinfo to IDC file
将用户自定义的数据类型保存到IDC文件
3.3 可执行文件的修改
hiew
- 快捷键
按键 | 功能 |
---|---|
F5 | 跳转到地址(支持相对地址和虚拟地址(前面加上. )) |
F1 | 帮助 |
F3 | 进入编辑状态 |
F2 | 修改汇编代码 |
F9 | 保存 |
3.4 静态分析技术应用实例
3.4.1 解密初步
3.4.2 逆向工程初步
1. 移除"mission failed"对话框
- IDA查看string窗口
- 双击字符“...mission failed...”,到代码处
- 双击交叉引用,记下地址
- 在OD中跳转到此地址,可nop掉,也可jump掉过,此处跳过,在
push 0
处,修改为jmp 0040124E
2. 将输入字符显示到对话框
- 在IDA name窗口中,双击GetWindowTextA的调用处
- 发现有两次调用,第一处比较可疑,进入
- OD将
jmp eax
nop掉,就可以执行下面的程序,GetWindowTextA将文本空间内容放到缓冲区,MessageBoxA从缓存区中读取文本并显示到消息框中
3. 修改字符
修改指定的字符串
-
查找指定字符串的两种方式
-
IDA-> shift+F12
-
OD -> 鼠标右键-Search for-All referenced text strings
OD ->鼠标右键-中文搜索-智能搜索 -> CTRL+F
ida给出的结果会更符合要求,OD给出了太多的结果
**new: 智能搜索更好用**
-
在ida中找到字符串之后,在od跳转到该地址
-
在该处右键-> follow dump-> selection,会在内存窗口中看到该字符串
-
ctrl+e
修改,可以在notepad中写好,然后使用shift+insert
粘贴 -
选中修改部分,右键->copy to executalbe file
-
在弹出的窗口中,选择修改后的部分,右键->save file
-
4. 完成序列号验证
-
找到合适的地址
-
在od中修改,代码如下
?不知道有没有一次性复制粘贴的办法
x86asm
cmp ecx,5
jnz 4012CD
mov edx,403000
mov bl,[eax]
mov bh,[edx]
cmp bl,bh
jnz 4012CD
inc eax
inc edx
dec ecx
jz 4012B8
jmp 40127A
- 保存
3.5 补充
3.5.1 快捷键
功能键 | 功能 |
---|---|
R | 将16机制码以字符串形式解读 |
F5 | 显示反汇编的源码 |
shift+F12 | 显示strings窗口 |
alt+T | 文本搜索 |
ctrl+T | 继续下一个查找 |
alt+B | 二进制搜索 |
B | 2/16进制转换 |
A | 解释光标处的地址为一个字符串的首地址 |
H | 16/10进制转换 |
; | 注释 |
X | 转换视图为交叉参考模式 |
shift+E | 提取数据 |
shift+F1 | 导出数据 |
- F5:查看源代码的过程中,及时将变量名(
N键
)改为有意义的名称 - 函数窗口:红色的无法反汇编成源码,白色的可以